package com.billdowney.util;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.cglib.beans.BeanMap;

/**
 * @ClassName: CommonUtil
 * @Description: 通用工具包
 * @author 超级小富翁 - BillDowney
 * @date 2018年1月8日 下午9:26:22
 */
public class CommonUtil {

	/**
	 * 是否为空
	 * 
	 * @param obj 判断的对象
	 * @return 为空返回true
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年3月23日 下午11:26:39
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmpty(Object obj) {
		if (obj == null) {
			return true;
		}
		try {
			if (new BigDecimal(obj.toString()).compareTo(new BigDecimal(0)) == 0) {
				return true;
			}
		} catch (Exception e) {
		}
		if ("".equals(obj)) {
			return true;
		} else if (obj instanceof String) {
			if (((String) obj).length() == 0) {
				return true;
			}
		} else if (obj instanceof Collection) {
			if (((Collection) obj).size() == 0) {
				return true;
			}
		} else if (obj instanceof Map) {
			if (((Map) obj).size() == 0) {
				return true;
			}
		} else if (obj.getClass().isArray()) {
			if (Array.getLength(obj) == 0) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断是否为空，如果为空返回true，不为空则抛出异常
	 * 
	 * @param obj 比较对象
	 * @param e   需要抛出的异常信息
	 * @return
	 * @throws RuntimeException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年3月23日 下午11:25:39
	 */
	public static boolean isEmpty(Object obj, RuntimeException e) throws RuntimeException {
		if (isEmpty(obj)) {
			return true;
		} else {
			throw e;
		}
	}

	/**
	 * 是否不为空
	 * 
	 * @param obj 判断对象
	 * @return 不为空则返回true
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年3月23日 下午11:27:31
	 */
	public static boolean isNotEmpty(Object obj) {
		return !isEmpty(obj);
	}

	/**
	 * 是否不为空，如果不为空返回true，为空则抛出异常
	 * 
	 * @param obj 判断对象
	 * @param e   抛出的异常
	 * @return 不为空则返回true
	 * @throws RuntimeException
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年3月23日 下午11:28:01
	 */
	public static boolean isNotEmpty(Object obj, RuntimeException e) throws RuntimeException {
		if (isNotEmpty(obj)) {
			return true;
		} else {
			throw e;
		}
	}

	/**
	 * @Function: beanToMap
	 * @Description: java对象转map
	 * @param bean 需要转换的java对象
	 * @return 转换好的Map对象
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月11日 上午10:30:24
	 */
	public static <T> Map<String, Object> beanToMap(T bean) {
		Map<String, Object> map = new HashMap<>();
		if (isNotEmpty(bean)) {
			BeanMap beanMap = BeanMap.create(bean);
			for (Object key : beanMap.keySet()) {
				map.put(key + "", beanMap.get(key));
			}
		}
		return map;
	}

	/**
	 * @Function: mapToBean
	 * @Description: 将对应的map对象转换为java对象
	 * @param map  需要转换的map对象
	 * @param bean 需要转换为的java对象
	 * @return 转换好的java对象
	 * @author: 超级小富翁 - BillDowney
	 * @param <T>
	 * @date: 2018年1月11日 上午10:35:59
	 */
	@SuppressWarnings("unchecked")
	public static <T> T mapToBean(Map<String, Object> map, Class<T> bean) {
		if (isEmpty(map))
			return null;
		try {
			Object obj = bean.newInstance();
			Field[] fields = obj.getClass().getDeclaredFields();
			for (Field field : fields) {
				int mod = field.getModifiers();
				if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
					continue;
				}
				field.setAccessible(true);
				field.set(obj, map.get(field.getName()));
			}
			return (T) obj;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * @Function: listBeanToMaps
	 * @Description: 将包含对象的list转换为List<Map<String, Object>>
	 * @param objList 包含对象的list对象
	 * @return 转换好的List<Map<String, Object>>
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月11日 上午11:01:04
	 */
	public static <T> List<Map<String, Object>> listBeanToMaps(List<T> objList) {
		List<Map<String, Object>> list = new ArrayList<>();
		if (isNotEmpty(objList)) {
			Map<String, Object> map = null;
			T bean = null;
			for (int i = 0, size = objList.size(); i < size; i++) {
				bean = objList.get(i);
				map = beanToMap(bean);
				list.add(map);
			}
		}
		return list;
	}

	/**
	 * @Function: mapsToListBean
	 * @Description: 该函数的功能描述
	 * @param maps
	 * @param clazz
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月11日 上午11:07:07
	 */
	public static <T> List<T> mapsToListBean(List<Map<String, Object>> maps, Class<T> clazz) {
		List<T> list = new ArrayList<>();
		try {
			if (isNotEmpty(maps)) {
				Map<String, Object> map = null;
				for (int i = 0, size = maps.size(); i < size; i++) {
					map = maps.get(i);
					list.add(mapToBean(map, clazz));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * @Description: 字符串转换unicode
	 * @param string
	 * @return
	 * @author: 唐路钧
	 * @date: 2018年11月19日 下午2:39:47
	 */
	public static String stringToUnicode(String string) {
		StringBuffer unicode = new StringBuffer();
		for (int i = 0; i < string.length(); i++) {
			// 取出每一个字符
			char c = string.charAt(i);
			// 转换为unicode
			unicode.append("\\u" + Integer.toHexString(c));
		}
		return unicode.toString();
	}

	/**
	 * @Description: unicode 转字符串
	 * @param unicode
	 * @return
	 * @author: 唐路钧
	 * @date: 2018年11月19日 下午2:39:58
	 */
	public static String unicodeToString(String unicode) {
		StringBuffer string = new StringBuffer();
		String[] hex = unicode.split("\\\\u");
		for (int i = 1; i < hex.length; i++) {
			// 转换出每一个代码点
			int data = Integer.parseInt(hex[i], 16);
			// 追加成string
			string.append((char) data);
		}
		return string.toString();
	}

	/**
	 * 数组对象转list对象
	 * 
	 * @param objs 需要转换的数组对象
	 * @return 转换好的List对象
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年2月27日 下午6:35:44
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> arrayToList(T... objs) {
		return Arrays.asList(objs);
	}

	/**
	 * list对象转数组
	 * 
	 * @param list list对象
	 * @return 转换好的数组对象
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年2月27日 下午6:45:10
	 */
	public static String[] listToArray(List<String> list) {
		return list.toArray(new String[list.size()]);
	}

}
